package sculove.spring.framework.common;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public abstract class AbstractDao extends SqlMapClientDaoSupport {

    @SuppressWarnings("unused")
    protected final Log logger = LogFactory.getLog(getClass());


    public Object queryForObject(String statementName, Object parameterObject){
        return getSqlMapClientTemplate().queryForObject(statementName, parameterObject);
    }

    public Object queryForObject(String statementName, Object parameterObject, Object resultObject){
        return getSqlMapClientTemplate().queryForObject(statementName, parameterObject, resultObject);
    }

    @SuppressWarnings("unchecked")
    public List queryForList(String statementName, Object parameterObject){
        return getSqlMapClientTemplate().queryForList(statementName, parameterObject);
    }

    /*
     * IBatis에서 제공하는 queryForList는 모든데이터를 메모리에 가져온다.
     * 따라서, 
     * Oracle의 rownum을 이용한 페이징을 구현함
     * 
     * 페이징할때는 꼭! count쿼리와 페이징쿼리 2개를 만든다.
     * 
     * paging쿼리의 id는 "업무쿼리Paging"으로 지정한다
     * <selct id=업무쿼리IDPaging>
     * 	<include refid=Paging.Start>
     * 	<include refid=업무쿼리ID>
     * 	<include refid=Paging.End>
     * </select>
     * 
     * count의 resultClass="java.lang.Integer"로 하며, id는 "업무쿼리IDPaging_cnt"로 지정한다.
     * <select id=업무쿼리IDPaging_cnt>
     * 	<include refid=Count.Start>
     * 	<include refid=업무쿼리ID>
     * 	<include refid=Count.End>
     * </select>
     *  
     */
//    public PageDTO queryForPage(String statementName, Object parameterObject, int currentPage, int recordCntPerPage)
//            throws Exception{
//        List pagedList = null;
//        PageIndexDTO pageIndex = null;
//        
//        if(parameterObject instanceof AbstractDto){
//
//            pageIndex = new PageIndexDto(currentPage, recordCntPerPage);
//            ((AbstractDto)parameterObject).setStartRecord(pageIndex.getStartRecord());
//            ((AbstractDto)parameterObject).setEndRecord(pageIndex.getEndRecord());
//
////            log.debug("===pageIndex.getStartRecord() " + pageIndex.getStartRecord());
////            log.debug("===pageIndex.getEndRecord() " + pageIndex.getEndRecord());
//            // total record count 구하기
//            pageIndex.setTotalRecord(((Integer)queryForObject(statementName + "_cnt", parameterObject)).intValue());
//
//            // record 구하기
//            pagedList = queryForList(statementName, parameterObject);
//
//            if(pageIndex.getTotalRecord() != pagedList.size()){
//                // count값이 같지 않을 경우, Exception처리
//
//            }else{
//                pageIndex.makeNavigation();
//            }
//        }else{
//            // Excpetion 처리;
//
//        }
//        return new PageDTO(pageIndex, pagedList);
//    }
}
